#pragma once

#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <fstream>
#include <algorithm>
#include <iomanip>

// 学生类
struct Student
{
    std::string _id;   // 学号
    std::string _name; // 姓名
    int _age;          // 年龄
    std::string _sex;  // 性别
    int _chinese;      // 语文成绩
    int _math;         // 数学成绩

    // 构造函数
    Student() : _age(0), _chinese(0), _math(0) {}
    Student(const std::string &id, const std::string &name, int age,
            const std::string &sex, int chinese, int math)
        : _id(id), _name(name), _age(age), _sex(sex), _chinese(chinese), _math(math) {}

    // 计算总分
    int GetTotalScore() const
    {
        return _chinese + _math;
    }

    // 计算平均分
    double GetAverageScore() const
    {
        return (_chinese + _math) / 2.0;
    }

    // 判断是否及格（60分及以上）
    bool IsPass() const
    {
        return _chinese >= 60 && _math >= 60;
    }

    // 获取等级（优：90+，良：80-89，中：70-79，及格：60-69，不及格：<60）
    std::string GetGrade() const
    {
        double avg = GetAverageScore();
        if (avg >= 90)
            return "优";
        else if (avg >= 80)
            return "良";
        else if (avg >= 70)
            return "中";
        else if (avg >= 60)
            return "及格";
        else
            return "不及格";
    }
};

// 存储学生数据
class StudentsManager
{
public:
    // 添加学生
    bool AddStudent(const Student &student)
    {
        // 检查学号是否已存在
        for (const auto &s : _students)
        {
            if (s._id == student._id)
            {
                return false; // 学号已存在
            }
        }
        _students.push_back(student);
        SaveToFile();
        return true;
    }

    // 删除学生
    bool DeleteStudent(const std::string &id)
    {
        auto it = std::remove_if(_students.begin(), _students.end(),
                                 [&](const Student &s) { return s._id == id; });
        if (it != _students.end())
        {
            _students.erase(it, _students.end());
            SaveToFile();
            return true;
        }
        return false;
    }

    // 修改学生信息
    bool UpdateStudent(const Student &student)
    {
        for (auto &s : _students)
        {
            if (s._id == student._id)
            {
                s = student;
                SaveToFile();
                return true;
            }
        }
        return false;
    }

    // 查找学生
    Student *FindStudent(const std::string &id)
    {
        for (auto &s : _students)
        {
            if (s._id == id)
            {
                return &s;
            }
        }
        return nullptr;
    }

    // 获取所有学生（按总成绩从大到小排序）
    std::vector<Student> GetAllStudents() const
    {
        std::vector<Student> students = _students;

        // 按总成绩从大到小排序
        std::sort(students.begin(), students.end(),
                  [](const Student &a, const Student &b)
                  {
                      return a.GetTotalScore() > b.GetTotalScore();
                  });

        return students;
    }

    // 获取学生总数
    size_t GetStudentCount() const
    {
        return _students.size();
    }

    // 计算语文平均分
    double GetChineseAverage() const
    {
        if (_students.empty())
            return 0.0;

        int total = 0;
        for (const auto &s : _students)
        {
            total += s._chinese;
        }
        return static_cast<double>(total) / _students.size();
    }

    // 计算数学平均分
    double GetMathAverage() const
    {
        if (_students.empty())
            return 0.0;

        int total = 0;
        for (const auto &s : _students)
        {
            total += s._math;
        }
        return static_cast<double>(total) / _students.size();
    }

    // 计算总体平均分
    double GetTotalAverage() const
    {
        if (_students.empty())
            return 0.0;

        return (GetChineseAverage() + GetMathAverage()) / 2.0;
    }

    // 计算及格率
    double GetPassRate() const
    {
        if (_students.empty())
            return 0.0;

        int passCount = 0;
        for (const auto &s : _students)
        {
            if (s.IsPass())
            {
                passCount++;
            }
        }
        return static_cast<double>(passCount) / _students.size() * 100.0;
    }

    // 计算不及格率
    double GetFailRate() const
    {
        return 100.0 - GetPassRate();
    }

    // 获取各等级比例
    struct GradeStats
    {
        double excellent; // 优
        double good;      // 良
        double medium;    // 中
        double pass;      // 及格
        double fail;      // 不及格
    };

    GradeStats GetGradeStats() const
    {
        GradeStats stats = {0, 0, 0, 0, 0};
        if (_students.empty())
            return stats;

        int excellent = 0, good = 0, medium = 0, pass = 0, fail = 0;

        for (const auto &s : _students)
        {
            std::string grade = s.GetGrade();
            if (grade == "优")
                excellent++;
            else if (grade == "良")
                good++;
            else if (grade == "中")
                medium++;
            else if (grade == "及格")
                pass++;
            else
                fail++;
        }

        int total = _students.size();
        stats.excellent = static_cast<double>(excellent) / total * 100.0;
        stats.good = static_cast<double>(good) / total * 100.0;
        stats.medium = static_cast<double>(medium) / total * 100.0;
        stats.pass = static_cast<double>(pass) / total * 100.0;
        stats.fail = static_cast<double>(fail) / total * 100.0;

        return stats;
    }

    // 从文件加载数据（用\t分割，支持字段含空格）
    void LoadFromFile()
    {
        std::ifstream file("students.txt");
        if (!file.is_open())
        {
            return;
        }

        _students.clear();
        std::string line;
        while (std::getline(file, line))
        {
            if (line.empty())
                continue;
            std::istringstream iss(line);
            std::string id, name, age_str, sex, chinese_str, math_str;

            // 依次用\t分割每个字段
            if (std::getline(iss, id, '\t') &&
                std::getline(iss, name, '\t') &&
                std::getline(iss, age_str, '\t') &&
                std::getline(iss, sex, '\t') &&
                std::getline(iss, chinese_str, '\t') &&
                std::getline(iss, math_str, '\t'))
            {
                int age = std::stoi(age_str);
                int chinese = std::stoi(chinese_str);
                int math = std::stoi(math_str);
                Student student(id, name, age, sex, chinese, math);
                _students.push_back(student);
            }
        }
        file.close();
    }

    // 保存数据到文件（用\t分割，避免字段含空格导致错位）
    void SaveToFile() const
    {
        std::ofstream file("students.txt");
        if (!file.is_open())
        {
            std::cerr << "无法打开文件保存学生数据" << std::endl;
            return;
        }

        for (const auto &s : _students)
        {
            // 用\t分割所有字段
            file << s._id << '\t' << s._name << '\t' << s._age << '\t'
                 << s._sex << '\t' << s._chinese << '\t' << s._math << '\n';
        }
        file.close();
    }

private:
    // 使用vector存储学生数据
    std::vector<Student> _students;
};
